<?php

/**
 * 地区库的service.
 *
 * @author xiaoxia.xu <xiaoxia.xuxx@aliyun-inc.com>
 * @copyright ©2003-2103 phpwind.com
 * @license http://www.windframework.com
 *
 * @version $Id: WindidAreaService.php 28948 2013-05-31 05:02:59Z jieyin $
 */
class WindidAreaService
{
    /**
     * 获取地区的省市信息.
     *
     * @param int $areaid
     *
     * @return array 返回array('省', '市', '县')
     */
    public function getAreaInfo($areaid)
    {
        $info = $this->_getWindidAreaDs()->getArea($areaid);
        if (!$info) {
            return array();
        }

        return explode('|', $info['joinname']);
    }

    /**
     * 根据地区ID获得该地区的从第一级开始的路径
     * 返回一个数组，该数组从第一个元素为最顶层的路径.
     *
     * @param int $areaid
     *
     * @return array
     */
    public function getAreaRout($areaid)
    {
        if (!$areaid) {
            return array();
        }
        $info = $this->_getWindidAreaDs()->getArea($areaid);
        if (!$info) {
            return array();
        }
        $rout = array();
        array_unshift($rout, $info);
        $parentid = $info['parentid'];
        while ($parentid > 0) {
            $_info = $this->_getWindidAreaDs()->getArea($parentid);
            array_unshift($rout, $_info);
            $parentid = $_info['parentid'];
        }

        return $rout;
    }

    /**
     * 根据地区ID列表获得地区.
     *
     * @param array $areaids
     *
     * @return array
     */
    public function fetchAreaInfo($areaids)
    {
        if (!$list = $this->_getWindidAreaDs()->fetchByAreaid($areaids)) {
            return array();
        }
        $array = array();
        foreach ($list as $key => $value) {
            $array[$key] = str_replace('|', ' ', $value['joinname']);
        }

        return $array;
    }

    /**
     * 批量获取地区的路径
     * 返回地区，每一个地区的路径元素都保存 省级/市级/地区级.
     *
     * @param array $areaids
     *
     * @return array
     */
    public function fetchAreaRout($areaids)
    {
        $list = $this->_getWindidAreaDs()->fetchByAreaid($areaids);
        if (!$list) {
            return array();
        }
        $routs = $parents = array();
        foreach ($list as $key => $_item) {
            if (!$_item['parentid']) {
                $routs[$key] = array($key, '', '');
            } else {
                $routs[$key] = array('', $_item['parentid'], $key);
                $parents[$_item['parentid']] = $key;
            }
        }
        if (!$parents) {
            return $routs;
        }
        $list = $this->_getWindidAreaDs()->fetchByAreaid(array_keys($parents));
        foreach ($list as $key => $_item) {
            $tmp = $routs[$parents[$key]];
            if (!$_item['parentid']) {
                $tmp[0] = $key;
                $tmp[1] = $parents[$key];
                $tmp[2] = '';
            } else {
                $tmp[0] = $_item['parentid'];
                $tmp[1] = $key;
                $tmp[2] = $parents[$key];
            }
            $routs[$parents[$key]] = $tmp;
        }

        return $routs;
    }

    /**
     * 获得地区数据
     * 支持3三级： 省-市-区.
     *
     * @param int $selected
     *
     * @return array
     */
    public function getAreaTree()
    {
        $areas = $this->_getWindidAreaDs()->fetchAll();
        //$areas = $this->getCacheArea(); //本地，从缓存获取
        if (!is_array($areas)) {
            return array();
        }
        $root = array();
        foreach ($areas as $areaid => $item) {
            if ($item['parentid'] == 0) {
                $root[$areaid] = array('name' => $item['name']);
                unset($areas[$areaid]);
            }
        }
        foreach ($root as $areaid => $item) {
            $childs = $this->_buildTree($areas, $areaid);
            $childs && $root[$areaid]['items'] = $childs;
        }

        return $root;
    }

    /**
     * 构建地区树.
     *
     * @param array $areas
     * @param int   $parentid
     *
     * @return array
     */
    private function _buildTree(&$areas, $parentid)
    {
        $childs = $temp = array();
        foreach ($areas as $areaid => $item) {
            if ($item['parentid'] == $parentid) {
                if (!isset($childs[$areaid])) {
                    $childs[$areaid] = array('name' => $item['name']);
                }
                $temp[] = $areaid;
            } elseif ($areas[$item['parentid']]['parentid'] == $parentid) {
                if (!isset($childs[$areas[$item['parentid']]['areaid']])) {
                    $childs[$areas[$item['parentid']]['areaid']] = array('name' => $areas[$item['parentid']]['name']);
                    $temp[] = $areas[$item['parentid']]['areaid'];
                }
                $childs[$areas[$item['parentid']]['areaid']]['items'][$areaid] = $item['name'];
                $temp[] = $areaid;
            }
        }
        foreach (array_unique($temp) as $_k) {
            unset($areas[$_k]);
        }

        return $childs;
    }

    /**
     * 根据地区ID获得该地区下级.
     *
     * @param int $areaid
     *
     * @return array
     */
    public function getAreaByParentid($areaid, $selected = 0)
    {
        $list = $this->_getWindidAreaDs()->getAreaByParentid($areaid);
        $return = array();
        foreach ($list as $item) {
            $return[] = array($item['areaid'], $item['name'], $item['areaid'] == $selected ? 1 : 0);
        }

        return $return;
    }

    /**
     * 更新缓存.
     *
     * @return bool
     */
    public function updateCache()
    {
        $data = $this->_getWindidAreaDs()->fetchAll();
        $file = Wind::getRealPath('DATA:area.area.php', true);
        WindFolder::mk(dirname($file));
        WindFile::savePhpData($file, $data, true);

        return $data;
    }

    protected function getCacheArea()
    {
        $file = Wind::getRealPath('DATA:area.area.php', true);
        if (WindFile::isFile($file)) {
            return include $file;
        }

        return $this->updateCache();
    }

    /**
     * 获得windid的地区DS.
     *
     * @return WindidArea
     */
    private function _getWindidAreaDs()
    {
        return Wekit::load('WSRV:area.WindidArea');
    }
}
